/*********************************************************************************************************************
版权所有 (C), 2021,
设计：山亦青
编码：山亦青
版本：V1.0.0.0
完成日期：2021.4.2
说明:
 ScreenSaverWidget类的实现
代码级别：u
*********************************************************************************************************************/

#include "ScreenSaverWidget.h"

ScreenSaverWidget::ScreenSaverWidget() :
    m_ScreenSaverTimer(this), // 屏幕保护的定时器
    m_NoOperationTimeInSec(0), // 界面没有操作的时间，单位为秒
    m_ScrnSaverTimeInSec(10), // 进入屏幕保护的时间，单位为秒，默认10
    m_isScrnSaverEnabled(Bool_false) //屏幕保护功能是否启用
{
    connect(&m_ScreenSaverTimer, SIGNAL(timeout()), this, SLOT(onScreenSaverTimer()));
    m_ScreenSaverTimer.start(1000);
}

ScreenSaverWidget::~ScreenSaverWidget()
{ }

// 设置屏幕保护功能是否有效
// 参数1：isEnabled，屏保功能是否启用
Void_t ScreenSaverWidget::setScrnSaverEnable(Bool_t isEnabled)
{
    m_isScrnSaverEnabled = isEnabled;
    if (isEnabled && (m_ScrnSaverTimeInSec >= 1))
    {
        // 如果是使能的，屏保等待时间是正数，把当前界面的所有子界面也全加进来
        QList<QWidget*> childrenWidgets = findChildren<QWidget*>();
        addWidgets(childrenWidgets);

        // 复位掉无操作时间
        m_NoOperationTimeInSec = 0;
    }
}

// 事件过滤器，只抓取鼠标按下和鼠标抬起的事件
Bool_t ScreenSaverWidget::eventFilter(QObject *pWatched, QEvent *pEvent)
{
    // 如果不使能屏保定时，直接返回
    if (!m_isScrnSaverEnabled)
    {
        return QWidget::eventFilter(pWatched, pEvent);
    }

    // 过滤事件类型，如果是鼠标按下，或者鼠标抬起，将无操作的时间计数清零
    QEvent::Type tp = pEvent->type();
    if ((tp == QEvent::Type::MouseButtonRelease)
        || (tp == QEvent::Type::MouseButtonPress))
    {
        m_NoOperationTimeInSec = 0;
    }
    return QWidget::eventFilter(pWatched, pEvent);
}

// 循环添加子控件
Void_t ScreenSaverWidget::addWidgets(QList<QWidget*>& widgetToAdd)
{
    for(QList<QWidget*>::iterator iter = widgetToAdd.begin();
        iter != widgetToAdd.end();
        ++iter)
    {
        (*iter)->installEventFilter(this);

        QList<QWidget*> children = (*iter)->findChildren<QWidget*>();
        addWidgets(children);
    }
}

// 获取屏幕保护功能是否启用
// 返回值：屏幕保护功能是否启用
Bool_t ScreenSaverWidget::getScrnSaverEnable()
{
    return m_isScrnSaverEnabled;
}

// 设置进入屏幕保护的时间
// 参数1：timeInSec，进入屏保的时间，单位为秒，0或负数则屏幕保护功能不是能
Void_t ScreenSaverWidget::setScrnProtTime(Int32_t timeInSec)
{
    m_ScrnSaverTimeInSec = timeInSec;
    if (m_isScrnSaverEnabled && (timeInSec >= 1))
    {
        // 如果是使能的，清空定时器当前计数
        m_NoOperationTimeInSec = 0;
    }
}

// 获取进入屏幕保护的时间
// 返回值：进入屏幕保护的时间，单位为秒。如果是不是能屏幕保护功能，返回-1
Int32_t ScreenSaverWidget::getScrnProtTime()
{
    return m_ScrnSaverTimeInSec;
}

/*
 * 添加界面组件，被加入该界面的组件，每当有鼠标(触控)事件时，都会复位掉m_NoOperationTimeInSec
 * 此外，本函数是循环遍历子组件，所以只需调用一次，无需循环遍历
 */
// 参数1：pWidgetToAdd，要添加的组件的指针
Void_t ScreenSaverWidget::addWidget(QWidget* pWidgetToAdd)
{
    QList<QWidget*> childrenWidgets = pWidgetToAdd->findChildren<QWidget*>();
    addWidgets(childrenWidgets);
}

void ScreenSaverWidget::onScreenSaverTimer()
{
    if (m_isScrnSaverEnabled && (m_ScrnSaverTimeInSec >= 1))
    {
        ++m_NoOperationTimeInSec;

        if (m_NoOperationTimeInSec >= m_ScrnSaverTimeInSec)
        {
            emit gotoScreenSaver();
        }
    }
}
